package collection;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**排序自定义类型元素
 *
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list = new ArrayList<>();
        list.add(new Point(2,4));
        list.add(new Point(1,1));
        list.add(new Point(2,9));
        System.out.println(list);
        /*Collections.sort(List list)
        * 该方法要求List集合中的元素必须是可比较的,判定是否可比较的标准为元素是否实现了接口:java.util.Comparable
        * 当我们使用一个API时,该API反过来要求我们为其修改代码(重写方法),那么这个API就对我们的程序有侵入性(为实现这个方法,要求我们改变类的内容),
        * 侵入性不利于程序后期维护,应当尽量避免.*/
        /*参数:集合,比较器(传入实现类)
        * 单独定义比较器(定义Point的比较规则)*/

        Comparator<Point> comparator = new Comparator<Point>() {
            /*compare方法用于定义o1和o2比较大小的规则,并用返回值表示大小关系
            * 返回值实现的要求:
            * 返回值>0,o1>o2
            * 返回值<0,o1<o2
            * 返回值=0,o1=o2
            * 放小的
            * */
            @Override
            public int compare(Point o1, Point o2) {
                int olen1 = o1.getX()* o1.getX() + o1.getY()*o1.getY();
                int olen2 = o2.getX()* o2.getX() + o2.getY()*o2.getY();
                return olen1 - olen2;
            }
        };
        Collections.sort(list,comparator);
        Collections.sort(list, (o1, o2) -> {//更好地解决侵入性
            int olen1 = o1.getX()* o1.getX() + o1.getY()*o1.getY();
            int olen2 = o2.getX()* o2.getX() + o2.getY()*o2.getY();
            return olen2 - olen1;
        });
        Collections.sort(list,(o1,o2)-> o1.getX()* o1.getX() + o1.getY()*o1.getY() - o2.getX()* o2.getX() - o2.getY()*o2.getY());
        System.out.println(list);
    }
}
